package dataClean;

import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 编码转换
 * 全、半角转换、字符集转换
 * @author Smartloe
 * @create 2021-04-25 16:33
 */
public class CleanData {
    //转码去除\s:空格、\n:换行符、\t:tab、\?:问号    
    public static void main(String[] ags) {
        String str = "this is data,process 这，是数据预处理";
        System.out.print(Objects.requireNonNull(transition(ToDBC(str), "GB2312")).replaceAll("\\?", "").replaceAll("\n", "").replaceAll("\t", "").replaceAll("\\s", ""));
        System.out.print(Objects.requireNonNull(transition(ToSBC(str), "GB2312")).replaceAll("\\?", ""));
    }

    //统一转码为一种格式
    public static String transition(String str, String Encode) {
        try {
            String strEncode = getEncoding(str);
            return new String(str.getBytes(strEncode), Encode);
        } catch (java.io.IOException ex) {
            return null;
        }
    }

    //获取文本所用字符集
    public static String getEncoding(String str) {
        String encode = "ISO-8859-1";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                return encode;
            }
        } catch (Exception ignored) {
        }
        encode = "GB2312";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                return encode;
            }
        } catch (Exception ignored) {
        }
        encode = "UTF-8";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                return encode;
            }
        } catch (Exception ignored) {
        }
        encode = "GBK";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                return encode;
            }
        } catch (Exception ignored) {
        }
        encode = "ASCII";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                return encode;
            }
        } catch (Exception ignored) {
        }
        encode = "GB18030";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                return encode;
            }
        } catch (Exception ignored) {
        }
        encode = "Unicode";
        try {
            if (str.equals(new String(str.getBytes(encode), encode))) {
                return encode;
            }
        } catch (Exception ignored) {
        }
        return "";
    }

    //判断字符串中是否有中文
    public static boolean isContainChinese(String str) {
        Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
        Matcher m = p.matcher(str);
        return m.find();
    }

    //全角占两个字节，半角占一个字节。
    //全角就是字母和数字等与汉字占等宽位置的字。
    //半角就是ASCII方式的字符,在没有汉字输入法起作用的时候输入的字母数字和字符都是半角的。
    //半角转全角
    public static String ToSBC(String input) {
        //java的一个char字符占用2个字节，即16位，65536的范围。
        //\u3000表示的是: 中文(全角)空格
        //其中3000表示一个16进制数字 这种格式是unicode码的写法表示一个char字符
        char[] c = input.toCharArray();
        for (int i = 0; i < c.length; i++) {
            if (c[i] == ' ') {
                c[i] = '\u3000';
            } else if (c[i] < '\177') {
                c[i] = (char) (c[i] + 65248);


            }
        }
        return new String(c);
    }

    //全角转半角
    public static String ToDBC(String input) {
        char[] c = input.toCharArray();
        for (int i = 0; i < c.length; i++) {
            if (c[i] == '\u3000') {
                c[i] = ' ';
            } else if (c[i] > '\uFF00' && c[i] < '\uFF5F') {
                c[i] = (char) (c[i] - 65248);
            }
        }

        return new String(c);
    }
}
